package com.xk._01基础篇._03链表;

/**
 * @description:
 * @author: xu
 * @date: 2022/9/15 20:27
 */
public abstract class AbstractList<E> implements List<E> {
    /**
     * 元素的容量
     */
    protected int size;

    /**
     * 元素的数量
     * @return
     */
    public int size() {
        return size;
    }

    /**
     * 是否为空
     * @return
     */
    public boolean isEmpty() {
        return size == 0;
    }

    /**
     * 是否包含某个元素
     * @param element
     * @return
     */
    public boolean contains(E element) {
        return indexOf(element) != ELEMENT_NOT_FOUND;
    }

    @Override
    public void remove(E element) {
        int index = indexOf(element);
        if (index == ELEMENT_NOT_FOUND) return;
        remove(index);
    }

    /**
     * 添加元素到尾部
     * @param element
     * 数组：
     *      最好：O(1)
     *      最坏：O(n) 只有在扩容的时候是O(n)
     *      平均：O(1) 大部分是最好的情况
     *      均摊：O(1)
     * 单向链表：
     *      最好：O(1)
     *      最坏：O(n) 只有在扩容的时候是O(n)
     *      平均：O(1) 大部分是最好的情况
     */
    public void add(E element) {
        add(size, element);
    }

    protected void outOfBounds(int index) {
        throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
    }

    protected void rangeCheck(int index) {
        if (index < 0 || index >= size){
            outOfBounds(index);
        }
    }

    protected void rangeCheckForAdd(int index) {
        if (index < 0 || index > size){
            outOfBounds(index);
        }
    }
}
